﻿package reglas.movimiento {

	
	import reglas.entidades.*;
	import flash.display.*;
	import flash.events.*;
	
	import motor.grafico.*;
	import flash.ui.Keyboard;
	
	public class AdmMovTeclado extends AdmMovimiento
	{	
		static public var ASCII_KEY_IZQ:uint = 68;
		static public var ASCII_KEY_DER:uint = 71;
		static public var ASCII_KEY_UP:uint = 82;
		static public var ASCII_KEY_DOWN:uint = 70;
	
	
		static public var ESTADO_KEY_NON:int = 0;
		static public var ESTADO_KEY_IZQ:int = 1;
		static public var ESTADO_KEY_DER:int = 2;
		static public var ESTADO_KEY_UP:int = 4;
		static public var ESTADO_KEY_DOWN:int = 8;
		
		private var currentKey:int;
		
		public function AdmMovTeclado(unaEntidad:EntidadControladaMovimiento)
		{
			super(unaEntidad);
			currentKey = ESTADO_KEY_NON;
			Graficos.getInstancia().getStage().addEventListener(KeyboardEvent.KEY_DOWN,eventoKeyDown);
			Graficos.getInstancia().getStage().addEventListener(KeyboardEvent.KEY_UP,eventoKeyUp);
		}
		
		private function cuantosUnos (valor:uint):int
		{
			var cnt:int = 0;
			var i:uint = 0;
			for (i=0;i<8;i++)
			{
				if ((valor & Math.pow(2,i)) == Math.pow(2,i))
				{
					cnt++;
				}
			}
			return cnt;
		}
		
		public function eventoKeyDown (e:KeyboardEvent)
		{
			trace ("AdmMovTeclado.eventoKeyDOWN");
			
			if (cuantosUnos(currentKey)>2)
			{
				trace("AdmMovTeclado.eventoKeyDOWN: No se aceptan mas de 2 teclas al mismo tiempo.")
				return;
			}
			
			
			//TECLAS...
			var key:uint = e.keyCode;
			key = toLowerCase(key);

			switch (key) {
				case ASCII_KEY_IZQ:
					if ((currentKey & ESTADO_KEY_IZQ) != ESTADO_KEY_IZQ)
					{
            			currentKey += ESTADO_KEY_IZQ;
					}
            	break;				
				case ASCII_KEY_DER:
					if ((currentKey & ESTADO_KEY_DER) != ESTADO_KEY_DER)
					{
            			currentKey += ESTADO_KEY_DER;
					}
            	break;
				
				case ASCII_KEY_UP:
					if ((currentKey & ESTADO_KEY_UP) != ESTADO_KEY_UP)
					{
            			currentKey += ESTADO_KEY_UP;
					}
            	break;
				case ASCII_KEY_DOWN:
					if ((currentKey & ESTADO_KEY_DOWN) != ESTADO_KEY_DOWN)
					{
            			currentKey += ESTADO_KEY_DOWN;
					}
            	break;
				

			}
		}
		
		public function eventoKeyUp (e:KeyboardEvent)
		{
			trace ("Key UP");
			var key:uint = e.keyCode;
			key = toLowerCase(key);

			switch (key) {
				case ASCII_KEY_IZQ:
					if ((currentKey & ESTADO_KEY_IZQ) == ESTADO_KEY_IZQ)
					{
            			currentKey -= ESTADO_KEY_IZQ;
					}
            	break;				
				case ASCII_KEY_DER:
					if ((currentKey & ESTADO_KEY_DER) == ESTADO_KEY_DER)
					{
            			currentKey -= ESTADO_KEY_DER;
					}
            	break;
				
				case ASCII_KEY_UP:
					if ((currentKey & ESTADO_KEY_UP) == ESTADO_KEY_UP)
					{
            			currentKey -= ESTADO_KEY_UP;
					}
            	break;
				case ASCII_KEY_DOWN:
					if ((currentKey & ESTADO_KEY_DOWN) == ESTADO_KEY_DOWN)
					{
            			currentKey -= ESTADO_KEY_DOWN;
					}
            	break;
			}
		}
		
		override public function animar()
		{
			if (currentKey==ESTADO_KEY_NON)
			{
				movIdle();
				return;
			}
			switch (currentKey)	{
				case ESTADO_KEY_IZQ:
					movIzq();
				break;
				
				case ESTADO_KEY_DER:
					movDer();
				break;
				case ESTADO_KEY_IZQ+ESTADO_KEY_DER:
					movIdle();
				break;
				
				case ESTADO_KEY_UP:
            		movUp();
            	break;
				
				case ESTADO_KEY_UP+ESTADO_KEY_IZQ:
            		movUpIzq();
            	break;
				case ESTADO_KEY_UP+ESTADO_KEY_DER:
            		movUpDer();
            	break;
				
				case ESTADO_KEY_DOWN:
            		movDown();
            	break;
				
				case ESTADO_KEY_DOWN+ESTADO_KEY_UP:
            		movIdle();
            	break;
				
				case ESTADO_KEY_DOWN+ESTADO_KEY_IZQ:
            		movDownIzq();
            	break;
				
				case ESTADO_KEY_DOWN+ESTADO_KEY_DER:
            		movDownDer();
            	break;
			}
			
		}
		
		private function toLowerCase(key:uint):uint
		{
			return key & 223;
		}
		
		override public function destroy()
		{
			super.destroy();
			Graficos.getInstancia().getStage().removeEventListener(KeyboardEvent.KEY_DOWN,eventoKeyDown);
			Graficos.getInstancia().getStage().removeEventListener(KeyboardEvent.KEY_UP,eventoKeyUp);
		}
		
	}
}